/*
 * The maRla Project - Graphical problem solver for statistical calculations.
 * Copyright © 2011 Cedarville University
 * http://marla.googlecode.com
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
/*
 * Copyright 2006-2008 Kees de Kooter
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package marla.opedit.gui.xmlpane;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;

/**
 * JTextPane implementation that can handle xml text. The IndentKeyListener
 * implements smart indenting.
 *  
 * @author kees
 * @date 27-jan-2006
 *
 */
public class XmlTextPane extends JTextPane
{
	private static final long serialVersionUID = 6270183148379328084L;
	private Logger logger = Logger.getLogger(getClass().getName());

	public XmlTextPane()
	{

		// Set editor kit
		this.setEditorKitForContentType("text/xml", new XmlEditorKit());
		this.setContentType("text/xml");

		addKeyListener(new IndentKeyListener());
	}

	private class IndentKeyListener implements KeyListener
	{
		private boolean enterFlag;
		private final Character NEW_LINE = '\n';

		public void keyPressed(KeyEvent event)
		{
			enterFlag = false;
			if((event.getKeyCode() == KeyEvent.VK_ENTER)
			   && (event.getModifiers() == 0))
			{
				if(getSelectionStart() == getSelectionEnd())
				{
					enterFlag = true;
					event.consume();
				}
			}
		}

		public void keyReleased(KeyEvent event)
		{
			if((event.getKeyCode() == KeyEvent.VK_ENTER)
			   && (event.getModifiers() == 0))
			{
				if(enterFlag)
				{
					event.consume();

					int start, end;
					String text = getText();

					int caretPosition = getCaretPosition();
					try
					{
						if(text.charAt(caretPosition) == NEW_LINE)
						{
							caretPosition--;
						}
					}
					catch(IndexOutOfBoundsException e)
					{
					}

					start = text.lastIndexOf(NEW_LINE, caretPosition) + 1;
					end = start;
					try
					{
						if(text.charAt(start) != NEW_LINE)
						{
							while((end < text.length())
								  && (Character.isWhitespace(text.charAt(end)))
								  && (text.charAt(end) != NEW_LINE))
							{
								end++;
							}
							if(end > start)
							{
								getDocument().insertString(
										getCaretPosition(),
										NEW_LINE
										+ text.substring(start,
														 end), null);
							}
							else
							{
								getDocument().insertString(getCaretPosition(),
														   NEW_LINE.toString(), null);
							}
						}
						else
						{
							getDocument().insertString(getCaretPosition(),
													   NEW_LINE.toString(), null);
						}
					}
					catch(IndexOutOfBoundsException e)
					{
						try
						{
							getDocument().insertString(getCaretPosition(),
													   NEW_LINE.toString(), null);
						}
						catch(BadLocationException e1)
						{
							logger.log(Level.WARNING, e1.toString());
						}
					}
					catch(BadLocationException e)
					{
						logger.log(Level.WARNING, e.toString());
					}
				}
			}
		}

		public void keyTyped(KeyEvent e)
		{
		}
	}
}
